// utils 包提供了项目中常用的工具函数和中间件
package utils

// 导入 net/http 包，用于处理 HTTP 请求和响应
import "net/http"

// DisableCacheMiddleware 是一个 HTTP 中间件，用于禁用客户端缓存，同时设置 CORS 相关头信息。
func DisableCacheMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(
		func(w http.ResponseWriter, r *http.Request) {
			// 设置 CORS 相关头信息，允许所有来源访问，支持多种 HTTP 方法和请求头
			w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE")
			w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
			// 设置缓存相关头信息，禁用客户端缓存
			w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
			w.Header().Set("Pragma", "no-cache")
			w.Header().Set("Expires", "0")
			// 处理 OPTIONS 请求，直接返回 200 状态码
			if r.Method == "OPTIONS" {
				w.WriteHeader(http.StatusOK)
				return
			}
			// 调用下一个处理器
			next.ServeHTTP(w, r)
		},
	)
}

// CORSMiddleware 是一个 HTTP 中间件，用于设置 CORS 相关头信息。
// 对于 OPTIONS 请求，会直接返回 200 状态码。
// 参数 next 是需要处理的下一个 http.Handler。
// 返回一个新的 http.Handler。
func CORSMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// 设置 CORS 相关头信息，允许所有来源访问，支持多种 HTTP 方法和请求头
		w.Header().Set("Access-Control-Allow-Origin", "*")
		w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE")
		w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
		// 处理 OPTIONS 请求，直接返回 200 状态码
		if r.Method == "OPTIONS" {
			w.WriteHeader(http.StatusOK)
			return
		}
		// 调用下一个处理器
		next.ServeHTTP(w, r)
	})
}
